/*
云游戏压力测试客户端 - 主程序入口
这是一个用于云游戏服务压力测试的HTTP服务器程序
主要功能：
1. 提供HTTP API接口用于启动和停止压力测试
2. 支持大规模并发客户端模拟
3. 集成性能监控和日志记录
4. 支持多环境配置管理

程序架构：
- 使用fasthttp作为高性能HTTP服务器
- 集成pprof进行性能分析
- 使用vlog进行结构化日志记录
- 支持配置热重载
*/
package main

import (
	"fmt"
	"net/http"
	_ "net/http/pprof" // 导入pprof用于性能分析
	"stress_tester/cg_area_client/service"

	"github.com/buaazp/fasthttprouter"
	"github.com/valyala/fasthttp"
	"gitlab.vrviu.com/inviu/backend-go-public/gopublic/config"
	"gitlab.vrviu.com/inviu/backend-go-public/gopublic/httpwrap"
	"gitlab.vrviu.com/inviu/backend-go-public/gopublic/vlog"
)

// initLogger 初始化日志系统
// 读取logger.json配置文件，设置日志格式、级别和输出方式
func initLogger() {
	filename := "./conf/logger.json"

	// 从配置文件创建日志配置
	c, err := vlog.NewConfig(filename)
	if err != nil {
		panic("init logger config file failed, file:" + filename + "err:" + err.Error())
	}

	// 应用日志配置
	vlog.SetConfig(c)
	// 替换标准库的日志输出
	vlog.ReplaceStdLog()
}

// 注释掉的配置初始化函数 - 当前版本不使用
//func initConfig() {
//	filename := "./conf/app.conf"
//
//	if acm, err := gopublic.CreateAreaConfigManager(filename); err != nil {
//		panic(err)
//	} else {
//		gopublic.GACM = acm
//		gopublic.GCM = acm.GCM
//	}
//}

// 注释掉的服务初始化函数 - 当前版本不使用Kafka
// func initServer() {
// 	// 创建kafka produer
// 	if err := kafkawrap.CreateSingletonKafkaProducer(kafkawrap.DefaultProducerConfig); err != nil {
// 		panic("create kafka producer failed. " + err.Error())
// 	}
// }

// initRouter 初始化HTTP路由
// 配置所有的API端点和对应的处理函数
func initRouter() *fasthttprouter.Router {
	// 创建新的路由器实例
	router := fasthttprouter.New()

	// 添加路由: 请求更新配置信息
	// GET /v1/config/reload - 热重载配置文件
	router.GET("/v1/config/reload", httpwrap.ResponseWrap(service.ReloadConfig))

	// 添加路由: 开始压力测试
	// POST /v1/aclient/start - 启动压力测试任务
	router.POST("/v1/aclient/start", httpwrap.ResponseWrap(service.Start))

	// 添加路由: 停止压力测试
	// GET /v1/server/stop - 停止指定的压力测试任务
	//router.GET("/v1/aclient/stop", httpwrap.ResponseWrap(service.Stop))
	router.GET("/v1/server/stop", httpwrap.ResponseWrap(service.Stop))

	return router
}

// main 主函数 - 程序入口点
func main() {
	// 启动pprof性能分析服务 (在独立的goroutine中运行)
	// 可通过 http://localhost:6061/debug/pprof/ 访问性能分析页面
	go func() {
		if err := http.ListenAndServe(":6061", nil); err != nil {
			fmt.Printf("Error starting pprof server: %v\n", err)
		}
	}()

	// 初始化日志系统
	initLogger()

	// 初始化配置系统 (当前版本已注释)
	//initConfig()

	// 初始化其他服务 (当前版本已注释)
	// initServer()

	// 记录服务启动信息
	vlog.Infof("startup server on %s", config.GetConfigManager().Section("service").Key("http_host").String())

	// 启动HTTP服务器
	// 从配置文件读取监听地址，使用初始化的路由器处理请求
	if err := fasthttp.ListenAndServe(config.GetConfigManager().Section("service").Key("http_host").String(), initRouter().Handler); err != nil {
		vlog.Errorf("listen and serve failed: %s", err.Error())
	}
}
